import axios from "axios";
import QS from "qs";
import { ElMessage } from "element-plus";
import UserStoress from "@/store/user";
import router from "@/router/index";

/**
 * 参考：https://juejin.cn/post/6844903652881072141
 */
//请求的域名
if (true) {
  //axios.defaults.baseURL = "http://magick.plugin/";
  axios.defaults.baseURL = "http://applenews.sofile.cn/";
} else {
  //axios.defaults.baseURL = "https://rouse.npc.ink/";
  axios.defaults.baseURL = "http://rouse.sofile.cn/";
  //axios.defaults.baseURL = "https://eirms.com/";
}

/**
 * 请求超时
 */
axios.defaults.timeout = 10000;
/**
 * 添加请求头
 */
//axios.defaults.headers.get['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
axios.defaults.headers.post["Content-Type"] =
  "application/x-www-form-urlencoded;charset=UTF-8";

/**
 * 请求拦截
 */
// 请求拦截器
axios.interceptors.request.use(
  (config) => {
    const store = UserStoress();

    // 每次发送请求之前判断vuex中是否存在token
    // 如果存在，则统一在http请求的header都加上token，这样后台根据token判断你的登录情况
    // 即使本地存在token，也有可能token是过期的，所以在响应拦截器中要对返回状态进行判断
    const token = store.token;
    //const token = "666";

    token && (config.headers.Authorization = "Bearer " + token);

    return config;
  },
  (error) => {
    //return Promise.error(error);
    return Promise.reject(error);
  }
);

/**
 * 响应拦截
 */
// 响应拦截器
axios.interceptors.response.use(
  (response) => {
    // 如果返回的状态码为200，说明接口请求成功，可以正常拿到数据
    // 否则的话抛出错误
    if (response.status === 200) {
      return Promise.resolve(response);
    } else {
      return Promise.reject(response);
    }
  },
  // 服务器状态码不是2开头的的情况
  // 这里可以跟你们的后台开发人员协商好统一的错误状态码
  // 然后根据返回的状态码进行一些操作，例如登录过期提示，错误提示等等
  // 下面列举几个常见的操作，其他需求可自行扩展
  (error) => {
    const store = UserStoress();
    console.log("有错误咯！");
    console.log(error);
    if (error.response.status) {
      switch (error.response.status) {
        // 401: 未登录
        // 未登录则跳转登录页面，并携带当前页面的路径
        // 在登录成功后返回当前页面，这一步需要在登录页操作。
        case 401:
          router.replace({
            path: "/login",
            query: {
              redirect: router.currentRoute.value.fullPath,
            },
            //这里的 redirect 是一个查询参数，用于记录用户在未登录时原本要访问的页面路径。当用户成功登录后，可以根据这个参数值来重新导航到原来的页面，实现无缝跳转
          });
          console.log("我执行咯！");
          break;

        // 403 token过期
        // 登录过期对用户进行提示
        // 清除本地token和清空vuex中token对象
        // 跳转登录页面
        case 403:
          //ElMessage({
          //  message: "登录过期，请重新登录",
          //  grouping: true,
          //  type: "warning",
          //  duration: 1500,
          //  offset: 150,
          //});
          // 清除token
          // store.$reset();
          // 跳转过期页面，并将要浏览的页面fullPath传过去，登录成功后跳转需要访问的页面
          //setTimeout(() => {
          //  router.replace({
          //    path: "/expore",
          //    query: {
          //      redirect: router.currentRoute.value.fullPath,
          //    },
          //  });
          //}, 200);
          break;

        // 404请求不存在
        case 404:
          ElMessage({
            message: "网络请求不存在",
            grouping: true,
            type: "warning",
            duration: 1500,
            offset: 150,
          });
          break;
        // 其他错误，直接抛出错误提示
        default:
          ElMessage({
            message: error.response.data.message,
            grouping: true,
            type: "warning",
            duration: 1500,
            offset: 150,
          });
      }
      return Promise.reject(error.response);
    }
  }
);

/**
 * get方法，对应get请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
export function get(url: string, params: any) {
  return new Promise((resolve, reject) => {
    axios
      .get(url, {
        params: params,
      })
      .then((res) => {
        resolve(res.data);
      })
      .catch((err) => {
        if (axios.isCancel(err)) {
          console.log("请求超时");
        }
        reject(err.data);
      });
  });
}

//返回所有值
export function gets(url: string, params: any) {
  return new Promise((resolve, reject) => {
    axios
      .get(url, {
        params: params,
      })
      .then((res) => {
        resolve(res);
      })
      .catch((err) => {
        if (axios.isCancel(err)) {
          console.log("请求超时");
        }
        reject(err.data);
      });
  });
}

/**
 * post方法，对应post请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
export function post(url: string, params: any) {
  return new Promise((resolve, reject) => {
    axios
      .post(url, QS.stringify(params))
      .then((res) => {
        resolve(res);
      })
      .catch((err) => {
        reject(err);
      });
  });
}
